#pragma once

#include <string>
#include <memory>
#include <unordered_map>
#include "position.h"
#include "order.h"

namespace hft {

class PositionManager {
public:
    // 构造函数
    PositionManager();
    
    // 处理成交回报
    void onTrade(const Trade& trade);
    
    // 更新最新价格
    void updateLastPrice(const std::string& symbol, double price);
    
    // 批量更新最新价格
    void updateLastPrices(const std::unordered_map<std::string, double>& prices);
    
    // 计算未实现盈亏
    void calculateUnrealizedPnL(const std::unordered_map<std::string, double>& last_prices);
    
    // 更新保证金率
    void updateMarginRatio(const std::string& symbol, double margin_ratio);
    
    // 获取持仓
    Position* getPosition(const std::string& symbol, const std::string& account, const std::string& strategy_id);
    
    // 获取账户的所有持仓
    std::vector<Position*> getAccountPositions(const std::string& account);
    
    // 获取策略的所有持仓
    std::vector<Position*> getStrategyPositions(const std::string& strategy_id);
    
    // 获取合约的所有持仓
    std::vector<Position*> getSymbolPositions(const std::string& symbol);
    
    // 获取所有持仓
    const std::unordered_map<std::string, Position>& getAllPositions() const;
    
    // 清算持仓（日终）
    void settle();
    
    // 注册持仓更新回调
    void registerPositionCallback(std::function<void(const Position&)> callback);

private:
    // 生成持仓键
    std::string generatePositionKey(const std::string& symbol, const std::string& account, const std::string& strategy_id);
    
    // 更新持仓
    void updatePosition(const Trade& trade);
    
    // 通知持仓更新
    void notifyPositionUpdate(const Position& position);

private:
    // 持仓映射表，键为 symbol:account:strategy_id
    std::unordered_map<std::string, Position> positions_;
    
    // 保证金率映射表，键为 symbol
    std::unordered_map<std::string, double> margin_ratios_;
    
    // 持仓更新回调
    std::function<void(const Position&)> position_callback_;
};

} // namespace hft